Kotlin 1.5
一言で表すと
Multi Platformへの対応を引き続きやっている
概要
Value Class
これまで inline class としてbetaだったものが value class に名前変更されてリリースされた。
code: kotlin
@JvmInline
value class UserId(val id: Int)
特徴としては以下
単一のプロパティしか持てない
immutableなプロパティのみ持てる (val のみ)
@JvmInline のアノテーションはそのうちいらなくなるかもらしい。
Mori Atsushi.icon これ必須なのか
Mori Atsushi.icon Javaからの利用が微妙らしい
違い
typealiasじゃだめなの?
typealias は例えば UserIdでもいいし、Intでもいいみたいな曖昧性がある。
data classじゃだめなの?
data classは実際にclassを使うけど、value class はコンパイルするとプリミティブになる。
Stable unsigned integer types
UInt、ULong、UByte、UShortといった unsigned 型がはいった。
符号なし整数の配列に関してはまだ beta なので、どうしても使いたいなら @ExperimentalUnsignedTypes
code:kotlin
val zero = 0U // Define unsigned numbers with literal suffixes
val ten = 10.toUInt()
Locale-agnostic API for uppercase and lowercase
これまで、Localeの問題で、toUpperCase、toLowerCase などがうまく動かんことがあった
例 : トルコ語では println("Kotlin".toUpperCase()) // KOTLİN
Localeに依存しないものが追加された
uppercase()
lowercase()
titlecase()
Clear Char-to-code and Char-to-digit conversions
これまで
code: kotlin
"4".toInt() // returns 4
'4'.toInt() // returns 52
charをtoInt()するとASCIIのあれが返ってくる
この問題を解決するために、文字とその整数コードや数値の間の変換を行う関数が用意された。
digitToX() で進数を意識しながら変換できる。.code でこれまでのChar.toInt() 相当の値を取得可能
code: kotlin
val capsK = Char(75) // ‘K’
val one = '1'.digitToInt(10) // 1
val digitC = 12.digitToChar(16) // hexadecimal digit ‘C’
println("${capsK}otlin ${one}.5.0-R${digitC}") // “Kotlin 1.5.0-RC”
println(capsK.code) // 75
Extended multiplatform char API
char周りを multiplatformでいけるようにした
Strict versions of String?.toBoolean()
toBooleanは結構雑に true / false を返すので、厳密に"true"という文字列のときにのみtrue、"false"という文字列のときのみfalse それ以外は nullにした
Duration API changes
Math operations: floored division and the mod operator
Collections: firstNotNullOf() and firstNotNullOfOrNull()
Test library changes
multi platformのprojectでkotlin-testの依存関係を単一化
kotlin-testを読み込むだけでいい。
プロジェクトが JVMだったら kotlin-test-junitを Kotlin/JSだったらkotlin-test-js をといったのりで勝手に推論する。
:gumioji: 賢いね
test frameworkの自動選択
kotlin-testへの依存を入れたら Kotlin/JVMなら JUnit4 が勝手に入る。
TestNGとかJUnit5も設定すれば入る。
code: kotlin
kotlin {
sourceSets {
val commonTest by getting {
dependencies {
// This brings the dependency
// on JUnit 4 transitively
implementation(kotlin("test"))
}
}
}
}
assert関数の update
新しく色々出てきた。
assertIs<T>()
assertIsNot<T>()
assertContentEquals()
assertEquals()
assertContains()
既存のassert関数であるassertTrue()、assertFalse()、expect()はすべてインライン化されるので、それらに渡されるラムダの中で susupend function が呼べるようになった。
気になるポイント
メモ
コメント
mayamito.icon charをtoInt()するとASCIIのあれが返ってくる問題でバグを仕込んだ経験があるのでdigitToX()はうれしい
Mori Atsushi.icon assertがそもそも苦手…、expectとかで書きたい
Go.iconmockkのany()がinline classで使えなくてエラーになっていたのが修正されると嬉しい
mayamito.icon value classはJavaのライブラリとの相性の悪さがコーナーケースで悪さしそうだけどこれはライブラリ側が頑張るしか無いのかな